/**
 * @param {number} k
 * @param {number[]} nums
 */
var KthLargest = function (k, nums) {
  this.k = k;
  this.heapArr = [];

  // 初始化堆，遍历 nums 数组
  nums.forEach((item) => this.add(item));
};

/**
 * @param {number} val
 * @return {number}
 */
KthLargest.prototype.add = function (val) {
  // 如果堆的大小小于k，直接添加元素
  if (this.heapArr.length < this.k) {
    this.heapArr.push(val);
  } else {
    // 如果堆的大小已满且新元素 val 大于堆顶元素，替换堆顶并排序
    if (this.heapArr[0] < val) {
      this.heapArr.shift(); // 移除最小元素（堆顶）
      this.heapArr.push(val); // 插入新元素
    }
  }

  // 对堆进行排序，保证堆是一个有序的数组
  this.heapArr.sort((a, b) => a - b);

  // 堆顶元素就是当前的第K大的元素
  return this.heapArr[0];
};

/**
 * Your KthLargest object will be instantiated and called as such:
 * var obj = new KthLargest(k, nums)
 * var param_1 = obj.add(val)
 */
